/*
*/
//{if 0}//
(function () {

    var core = ecui,
        dom = core.dom,
        string = core.string,
        ui = core.ui,
        util = core.util,

        ieVersion = /msie (\d+\.\d)/i.test(navigator.userAgent) ? document.documentMode || +RegExp.$1 : undefined,

        createDom = dom.create,
        insertBefore = dom.insertBefore,
        setInput = dom.setInput,
        setStyle = dom.setStyle,
        encodeHTML = string.encodeHTML,
        attachEvent = util.attachEvent,
        blank = util.blank,
        detachEvent = util.detachEvent,
        timer = util.timer,

        $bind = core.$bind,
        getFocused = core.getFocused,
        inheritsControl = core.inherits,
        triggerEvent = core.triggerEvent,
        wrapEvent = core.wrapEvent,

        UI_INPUT_CONTROL = ui.InputControl,
        UI_INPUT_CONTROL_CLASS = UI_INPUT_CONTROL.prototype;
//{/if}//
//{if $phase == "define"}//
    /**
     * 初始化输入控件。
     * options 对象支持的属性如下：
     * @public
     *
     * @param {Object} options 初始化选项
     */
    var UI_TEXT_INPUT = ui.TextInput = inheritsControl(
            UI_INPUT_CONTROL,
            null,
            null,
            function (el, options) {
                this._aSegment = ['', '', ''];
            }
        ),
        UI_TEXT_INPUT_CLASS = UI_TEXT_INPUT.prototype;
//{else}//
    UI_TEXT_INPUT_CLASS.$change = function () {
        UI_INPUT_CONTROL_CLASS.$change.call(this);

        var value = control.getValue(),
            segments = control._aSegment,
            end = value.length - segments[2].length;

        // 如果是删除操作直接结束
        control._sInput = end < 0 ? undefined : value.slice(segments[0].length, end);
        triggerEvent(control, 'change');
    }

    /**
     * 获取当前输入的内容，如果是粘贴操作是一个长度超过1的字符串。
     * @protected
     *
     * @return {string} 当前输入的内容
     */
    UI_TEXT_INPUT_CLASS.$getInputText = function () {
        return this._sInput;
    };

    /**
     * 控件拥有焦点时，键盘按下事件(鼠标在控件区域内移动事件)的默认处理。
     * 三种方式能改变输入框内容：1) 按键；2) 鼠标粘贴；3) 拖拽内容，keydown 在 change 事件前，因此按键改变内容方式时最适合记录 change 前光标信息，用于记录用户选择的内容。
     * @protected
     *
     * @param {Event} event 事件对象
     */
    UI_TEXT_INPUT_CLASS.$keydown = UI_TEXT_INPUT_CLASS.$keypress = UI_TEXT_INPUT_CLASS.$mousemove = function (event) {
        UI_INPUT_CONTROL_CLASS['$' + event.type].call(this, event);

        var value = this.getValue(),
            start = this.getSelectionStart(),
            end = this.getSelectionEnd();

        this._aSegment = [value.slice(0, start), value.slice(start, end), value.slice(end)];
    };

    /**
     * 获取当前当前选区的结束位置。
     * @public
     *
     * @return {number} 输入框当前选区的结束位置
     */
    UI_TEXT_INPUT_CLASS.getSelectionEnd = ieVersion ? function () {
        var range = document.selection.createRange().duplicate();

        range.moveStart('character', -this._eInput.value.length);
        return range.text.length;
    } : function () {
        return this._eInput.selectionEnd;
    };

    /**
     * 获取当前选区的起始位置。
     * @public
     *
     * @return {number} 输入框当前选区的起始位置，即输入框当前光标的位置
     */
    UI_TEXT_INPUT_CLASS.getSelectionStart = ieVersion ? function () {
        var range = document.selection.createRange().duplicate(),
            length = this._eInput.value.length;

        range.moveEnd('character', length);
        return length - range.text.length;
    } : function () {
        return this._eInput.selectionStart;
    };

    /**
     * 恢复输入框的值。
     * @public
     */
    UI_TEXT_INPUT_CLASS.restore = function () {
        this.setValue(this._aSegment.join(''));
        this.setCaret(this._aSegment[0].length);
    };

    /**
     * 设置输入框光标的位置。
     * @public
     *
     * @param {number} pos 位置索引
     */
    UI_TEXT_INPUT_CLASS.setCaret = ieVersion ? function (pos) {
        var range = this._eInput.createTextRange();
        range.collapse();
        range.select();
        range.moveStart('character', pos);
        range.collapse();
        range.select();
    } : function (pos) {
        this._eInput.setSelectionRange(pos, pos);
    };
//{/if}//
//{if 0}//
})();
//{/if}//
